#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/videodev2.h>
#include <sys/mman.h>
#include <linux/fb.h>
#include <vector>
#include <algorithm>

#define MEM_COUNT 4

using namespace std;

class Util
{
public:
    // yuyv格式转rgb格式
    static void uyvy_to_rgb(unsigned char *uyvydata, unsigned char *rgbdata, int w, int h);
    // 将图像显示的方式转为横屏模式（居中显示/左上角开始显示）
    static void lcd_to_argb(unsigned char *rgbdata,
         int img_w, int img_h, unsigned int *lcd_ptr, int lcd_w, int lcd_h);
};

class OV_V4L2
{
public:
    struct mem
    {
        unsigned char *mptr;
        size_t size;
    };

public:
    // 构造
    OV_V4L2();
    // 获取摄像头支持的格式
    bool get_fmt_desc();
    // 获取摄像头设置的格式
    void get_fmt(struct v4l2_format *v4l2_fmt);
    // 设置摄像头格式
    bool set_fmt();
    // 申请内核空间映射到用户空间
    bool rqMemorytoUsr();
    // 开始采集
    bool start();
    // 停止采集
    bool stop();
    // 析构函数
    ~OV_V4L2();

private:
    vector<struct mem> v_mem_; // 记录申请空间的首地址
    int dev_fd_;
    int lcd_fd_;
    unsigned int *lcdptr_;
    int lcd_w_, lcd_h_;
};

